package com.liuwei.msmall.order.config;

import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Classname MyOpenFeginConfig
 * @Description TODO
 * @Date 2020/7/8 10:29
 * @Created by 刘
 */
//为feign的远程调用添加上请求头信息
//默认的fegin的远程调用，发送http请求时会丢失请求头信息
@Configuration
public class MyOpenFeginConfig {

    /**
     * fegin 底层源码，遍历每个RequestInterceptor，并将封装好的RequestTemplate（将要发送的http请求信息）设置进去
     *  for (RequestInterceptor interceptor : requestInterceptors) {
              interceptor.apply(template);
        }
     return target.apply(template);
     *
     *
     */
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor(){
        return (template) -> {
                System.out.println("requestInterceptor线程id:"+Thread.currentThread().getId());
                //拿到原来的请求信息，spring自动封装的，底层使用ThreadLocal做的数据共享，即主线程中共享，如果不在同一个线程中，即无法获取数据
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if (requestAttributes!=null){
                    HttpServletRequest request = requestAttributes.getRequest();
                    //拿到原来请求信息中的cookie信息
                    String cookie = request.getHeader("Cookie");
                    //重新设置请求信息,将cookie信息重新设置进去
                    template.header("Cookie",cookie);
                    //这样就保证了fegin在远程调用时，不会丢失请求头信息，不会出现不同服务之间调用时用户未登录状态
                    //保证了用户登录之后处处生效
                }

            };
    }

}
